Spring Security 实战干货:自定义配置类入口WebSecurityConfigurerAdapter
1. 前言
今天我们要进一步的的学习如何自定义配置 Spring Security 我们已经多次提到了 WebSecurityConfigurerAdapter
,而且我们知道 Spring Boot 中的自动配置实际上是通过自动配置包下的 SecurityAutoConfiguration
总配置类上导入的 Spring Boot Web 安全配置类 SpringBootWebSecurityConfiguration
来配置的。所以我们就拿它开刀。如果还是一头雾水建议通过 https://felord.cn 查看 Spring Security 实战 。
2. 自定义 Spring Boot Web 安全配置类
我们使用我们最擅长的 Ctrl + C
、Ctrl + V
抄源码中的 SpringBootWebSecurityConfiguration
,命名为我们自定义的 CustomSpringBootWebSecurityConfiguration
:
@Configuration
@ConditionalOnClass(WebSecurityConfigurerAdapter.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
public class CustomSpringBootWebSecurityConfiguration {
@Configuration
@Order(SecurityProperties.BASIC_AUTH_ORDER)
static class DefaultConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
super.configure(auth);
}
@Override
public void configure(WebSecurity web) throws Exception {
super.configure(web);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
}
}
}
相信已经有人注意到了上面 DefaultConfigurerAdapter
中我覆写(@Override
)了三个方法,我们一般会通过自定义配置这三个方法来自定义我们的安全访问策略。
2.1 认证管理器配置方法
void configure(AuthenticationManagerBuilder auth)
用来配置认证管理器AuthenticationManager
。说白了就是所有 UserDetails
相关的它都管,包含 PasswordEncoder
密码机。如果你不清楚可以通过 Spring Security 中的 UserDetail 进行了解。本文对 AuthenticationManager
不做具体分析讲解,后面会有专门的文章来讲这个东西 。 可通过 Spring Security 实战系列 进行学习。
2.2 核心过滤器配置方法
void configure(WebSecurity web)
用来配置 WebSecurity
。而 WebSecurity
是基于 Servlet Filter
用来配置 springSecurityFilterChain
。而 springSecurityFilterChain
又被委托给了 Spring Security 核心过滤器 Bean DelegatingFilterProxy
。 相关逻辑你可以在 WebSecurityConfiguration
中找到。我们一般不会过多来自定义 WebSecurity
, 使用较多的使其ignoring()
方法用来忽略 Spring Security 对静态资源的控制。
2.3 安全过滤器链配置方法
void configure(HttpSecurity http)
这个是我们使用最多的,用来配置 HttpSecurity
。 HttpSecurity
用于构建一个安全过滤器链 SecurityFilterChain
。SecurityFilterChain
最终被注入核心过滤器 。 HttpSecurity
有许多我们需要的配置。我们可以通过它来进行自定义安全访问策略。所以我们单独开一章来讲解这个东西。
3. HttpSecurity 配置
HttpSecurity
是后面几篇文章的重点,我们将实际操作它来实现一些实用功能。所以本文要着重介绍它。
3.1 默认配置
protected void configure(HttpSecurity http) throws Exception {
logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin().and()
.httpBasic();
}
上面是 Spring Security 在 Spring Boot 中的默认配置。通过以上的配置,你的应用具备了一下的功能:
所有的请求访问都需要被授权。
使用
form
表单进行登陆(默认路径为/login
),也就是前几篇我们见到的登录页。防止
CSRF
攻击、XSS
攻击。启用
HTTP Basic
认证
3.2 常用方法解读
HttpSecurity
使用了builder
的构建方式来灵活制定访问策略。最早基于 XML
标签对 HttpSecurity
进行配置。现在大部分使用 javaConfig
方式。常用的方法解读如下:
4. 总结
到今天为止,我们已经由浅入深学习了很多关于 Spring Security 的知识。已经具有开始自定义来实现一些实用的功能了,在后面的文章开始我们将结合实际开发场景进行一些实战操作。敬请关注公众号:Felordcn
以第一时间获取相关教程。
● Spring Security 实战干货:路径Uri中的 Ant 风格